官方题解 | 欢乐赛#73题解
赛纲介绍
本次题目的总体题目难度如下,各位选手可以借此评估一下自身的技术水平
题目编号 题目名称 题目难度 T1 皓仔的天气预报 入门 T2 皓仔的考试结果 入门 T3 皓仔的配对检测 入门 T4 皓仔的表格观察 入门 T5 皓仔的上升子数组 普及- T6 皓仔的质数子矩阵 普及-
T1 皓仔的天气预报
题目大意
给定月份,日期,温度,按照以下格式输出今日的天气预报。
m月d日,今天气温t度。
题解思路
定义三个变量 m,d,tm, d, tm,d,t, 用以表示月份,日期还有温度。
而后使用 printf 函数根据题目给定的格式输出一份天气预报即可。
参考代码
T2 皓仔的考试结果
题目大意
学期结束后,皓仔拿到了两门成绩:
* 平时成绩
* 期末成绩
老师规定,只要满足下面任意一种情况,就算通过考试:
* 期末成绩大于等于 909090
* 平时成绩和期末成绩都大于等于 606060
现在请你根据皓仔的两门成绩,判断他是否通过考试。
如果通过考试,输出 Pass;否则输出 Fail。
题解思路
定义两个变量 a,ba, ba,b 用以存储皓仔的平时成绩以及期末成绩。
对于能够通过的两种情况 :
* 期末成绩大于等于 909090 分,也就是 b >= 90
* 平时成绩和期末成绩都大于等于 606060 分, 也就是 a >= 60 && b >= 60
两个情况只要满足其中一个就可以通过考试了,所以可以将两个条件使用逻辑或运算符连接,也就是 b >= 90 || a >= 60 && b >= 60, 此时输出 Pass, 否则输出 Fail。
参考代码
T3 皓仔的配对检测
题目大意
给定两个长度为 nnn 的数组 AAA 和 BBB。
对于每一对下标相同的数字 Ai,BiA_i, B_iAi ,Bi ,如果它们的和是偶数,皓仔就认为这一对是“合格配对”。
现在皓仔想知道:
在全部 nnn 对数字中,“合格配对”所占的百分比,是否落在区间 [a,b][a,b][a,b] 内。
如果满足,输出 Yes;否则输出 No。
题解思路
首先使用循环分别输入两个数组, 而后从 1∼n1\sim n1∼n 遍历整个数组, 每当发现 (a[i] + b[i]) % 2 == 0 时候,则配对数量 cntcntcnt 加一。
那么此时的配对比例的百分数就是 cnt * 100.0 / n, 此处为了计算百分数的值同时转化成小数输出,因此在算式中乘以了 1.0 。
最后根据该百分数是否落在 [a,b][a, b][a,b] 之间来决定输出 Yes 或者 No。
参考代码
T4 皓仔的表格观察
题目大意
给定一个 nnn 行 mmm 列的整数表格。
对于一个点的坐标 (i,j)(i, j)(i,j), 如果第 jjj 列的总和小于等于第 iii 行的总和,
那么皓仔这个位置是一个“合格点”。
现在请你帮皓仔统计:整个表格中一共有多少个“合格点”。
题解思路
本题可以考虑对于每个点 (i,j)(i, j)(i,j), 直接循环遍历求第 iii 行以及第 jjj 列的总和来判断合格点。
也可以使用更简洁一些的写法,额外开两个数组 sum1sum1sum1 以及 sum2sum2sum2 来存储每一行的总和以及每一列的总和,例如 sum1[i] 表示第 iii 行的总和, sum2[j]表示第 jjj 列的总和。
遍历所有的位置 (i,j)(i, j)(i,j), 那么第 jjj 列的总和小于等于第 iii 行的总和可以直接用 sum2[j] >= sum1[i] 来进行判定,统计合格点的数量然后输出即可。
参考代码
T5 皓仔的上升子数组
题目大意
皓仔写下了 nnn 个十六进制数,并按顺序排成了一个序列。
注意这些十六进制数的数位可能很多,每个数的长度最多可达 200200200 位。
现在,皓仔想知道:在这个序列中,最长的“连续上升子数组”长度是多少。
题解思路
需要注意的是本题中的十六进制数数位可能非常多,因此转化成十进制数再做比较式做不到的,因为对应的十进制数没法儿存储。
因此本题中的每一个数字需要用字符串存储,数字大小的比较也需要以字符串的形式来进行判断。
字符串存储的数字比大小可以按照以下规则:
* 数字长度不一样的,则长度更大的数值更大。
* 数字长度一样的, 则字典序更大的则数值更大。
从前往后遍历每一个数字,当前数字比前一个数更大的话,则连续上升子数组长度加一, 否则上升子数组长度重置为 111, 过程中不断更新答案的最大值即可。
参考代码
T6 皓仔的上升子数组
题目大意
给定一个 nnn 行 mmm 列的整数矩阵。
问在这个矩阵的所有子矩阵中,一共有多少个子矩阵的元素和是质数。
题解思路
本题需要枚举所有的子矩阵并且求总和,需要掌握枚举子矩阵的方法。
可以先枚举子矩阵的左上角的坐标 (i,j)(i, j)(i,j), 再枚举右下角的坐标 (t,k)(t, k)(t,k), 那么就可以得到一个行号为 [i,t][i, t][i,t], 列号为 [t,k][t, k][t,k] 的子矩阵。
因此可以通过四重的循环嵌套分别枚举 i,j,k,ti, j, k, ti,j,k,t, 注意需要满足 k >= i 并且 t >= j并且在该矩阵内部求子矩阵的总和, 然后使用试除法判定是否是质数, 如果是质数的话则答案加一。
参考代码